const {handleWhere} = require('../../sync/')
const {getResult, getError} = require('../../handle')

/**
 * 获取所有的子节点数据id
 */
const getAllChildrenIds = ({cloud, name, space, collection, get, parentKey, ChildKey, parentValue, config, isApp} = {}) => {
	return new Promise((resolve, reject) => {
		const params = {getTree: {startWith: `${ChildKey}=="${parentValue}"`}}
		if (parentKey) { // 当数据库中有多个parentKey时，必须指定
			params.parentKey = parentKey
		}
		get({cloud, name, space}, params).then(res => {
			const ids = []
			const handleArray = (array) => {
				array.forEach(item => {
					ids.push(item._id)
					if (item.children) {
						handleArray(item.children)
					}
				})
			}
			handleArray(res.data)
			resolve(ids)
		}).catch(reject)
	})
}

/**
 * 删除一条或者多条数据
 * cloud：云服务对象
 * name：操作的数据库
 * collection：是否已有固定的操作对象了。该操作对象必须依赖于doc
 * params：其它需要的参数。可以是字符串，字符串同where，可以是对象
 * 	doc：要删除的单个或多个_id。字符串数组皆可
 * 	where：要删除的数据条件
 * 		’all'：全部删除
 * 		其它字符串，表示jql语法
 * 		对象，表示非jql语法的查询的条件
 * 	isDelete：是否真的删除
 * 	ChildKey：如果存在，如果ChildTo不存在将删除所有子级数据；如果ChildTo存在就转移所有的子数据到ChildTo这条数据上。如果不存在，只处理单条数据
 * 	ChildTo：如果存在，将转移所有子级数据到这条数据身上
 * ChildTo和ChildKey的删除，只接受params中存在doc或者_id，即单条数据删除
 * 
 * 删除时务必注意select类型查询时，必须保证每一个都有值，否则会删除所有数据！
 */
module.exports = ({cloud, name, space, collection, get} = {}, params, config, isApp = false) => {
	return new Promise((resolve, reject) => {
		var db
		if (collection) {
			if (params.doc || params._id) {
				var id = params.doc || params._id
				if (typeof(id) === 'string') {
					db = collection.doc(id)
				}
			}
		}
		const {ChildKey, ChildTo, parentKey, isDelete} = params || {}
		if (ChildKey || ChildTo) {
			delete params.ChildKey
			delete params.ChildTo
		}
		// 常规删除的动作
		const removeAction = () => {
			if (!db) {
				db = handleWhere({cloud, name, space}, params, config, isApp)
			}
			if (db) {
				if (isDelete) {
					// 真的删除
					db = db.remove()
				} else {
					/**
					 * 实际为修改性删除
					 * 而且前段不支持使用更新操作符
					 * 即：JQL语法暂不支持使用更新操作符
					 */
					const data = {remove: true, alert_time: Date.now()}
					if (isApp) {
						data.HISTORY = [JSON.parse(JSON.stringify(data))]
						data.HISTORY.isApp = true
					} else {
						data.HISTORY = cloud.database().command.unshift([JSON.parse(JSON.stringify(data))])
					}
					db = db.update(data)
				}
				db.then(res => {
					if (res.result) {
						res = JSON.parse(JSON.stringify(res.result))
					}
					const {updated, deleted} = res
					res.message = `删除${updated || deleted || 0}条成功`
					resolve(getResult(res))
				}).catch(reject)
			} else {
				reject(getError('数据库对象不存在'))
			}
		}
		
		if (ChildKey) {
			var parentValue = params[ChildKey]
			if (!parentValue) {
				if (ChildKey === '_id' && params.doc) {
					parentValue = params.doc
				}
			}
			if (parentValue) {
				// 先获取所有的子节点id
				getAllChildrenIds({cloud, name, space, collection, get, parentKey, ChildKey, parentValue, config, isApp}).then(ids => {
					if (ids.length > 0) {
						params = {where: {_id: {filterType: 'select', filter: ids}}}
						if (ChildTo) { // 转移子数据删除当前
							if (ids.length > 1) {
								// 只需将第一条子数据的父级id修改为ChildTo即可
								var tempDb = handleWhere({cloud, name, space}, {_id: ids[0]}, config, isApp)
								const data = {alert_time: Date.now()}
								data[ChildKey] = ChildTo
								if (isApp) {
									data.HISTORY = [JSON.parse(JSON.stringify(data))]
									data.HISTORY.isApp = true
								} else {
									data.HISTORY = cloud.database().command.unshift([JSON.parse(JSON.stringify(data))])
								}
								tempDb.update(data).then(res => { // 然后删除当前
									removeAction()
								}).catch(reject)
							} else { // 只有第一条，直接删除
								removeAction()
							}
						} else { // 删除当前以及子数据
							removeAction()
						}
					} else {
						reject(getError('没有要删除的节点数据'))
					}
				}).catch(reject)
			} else {
				reject(getError('不存在节点值'))
			}
		} else { // 常规的删除操作
			removeAction()
		}
	})
}